class Watcher {
  constructor(vm, key, cb) {
    this.vm = vm
    // data 中的属性
    this.key = key
    // 回调函数，更新视图
    this.cb = cb

    // 把 watcher 对象记录到 Dep 类的静态属性 target
    Dep.target = this
    // 触发 get 方法，在 get 方法中会调用 addSub
    this.oldValue = vm[key]
    Dep.target = null // 需要重置，防止以后重新赋值
  }

  // 当书数据发生变化时，更新视图
  update() {
    // 在调用 update 时，数据已经发生变化，因此 newValue 就是新值 
    let newValue = this.vm[this.key]
    if (newValue === this.oldValue) return 
    this.cb(newValue)
  }
}